package com.xingchi.tornado.storage.core.utils;

import com.xingchi.tornado.storage.core.enums.FileTypeEnum;
import org.apache.commons.io.FilenameUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 文件类型校验器
 *
 * @author xingchi
 * @date 2024/5/5 13:11
 */
public class FileTypeChecker {

    private static final Map<String, FileTypeEnum> FILE_TYPE_MAP = new HashMap<>();

    static {
        // 图片
        FILE_TYPE_MAP.put(".jpg", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".jpeg", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".png", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".gif", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".bmp", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".tif", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".tiff", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".ico", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".svg", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".webp", FileTypeEnum.IMAGE);
        FILE_TYPE_MAP.put(".jfif", FileTypeEnum.IMAGE);

        // 视频
        FILE_TYPE_MAP.put(".mp4", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".avi", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".mov", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".mkv", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".wmv", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".flv", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".webm", FileTypeEnum.VIDEO);
        FILE_TYPE_MAP.put(".3gp", FileTypeEnum.VIDEO);

        // 音频
        FILE_TYPE_MAP.put(".mp3", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".wav", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".flac", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".aac", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".ogg", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".wma", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".m4a", FileTypeEnum.AUDIO);
        FILE_TYPE_MAP.put(".ape", FileTypeEnum.AUDIO);

        // 文档
        FILE_TYPE_MAP.put(".doc", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".docx", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".pdf", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".txt", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".ppt", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".pptx", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".xls", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".xlsx", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".odt", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".ods", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".odp", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".rtf", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".csv", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".xml", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".json", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".html", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".htm", FileTypeEnum.DOCUMENT);
        FILE_TYPE_MAP.put(".md", FileTypeEnum.DOCUMENT);
    }

    public static FileTypeEnum getFileType(String fileName) {
        String extension = "." + FilenameUtils.getExtension(fileName).toLowerCase();
        return FILE_TYPE_MAP.getOrDefault(extension.toLowerCase(), FileTypeEnum.OTHER);
    }

    public static boolean isImage(String fileName) {
        return getFileType(fileName) == FileTypeEnum.IMAGE;
    }

    public static boolean isVideo(String fileName) {
        return getFileType(fileName) == FileTypeEnum.VIDEO;
    }

    public static boolean isAudio(String fileName) {
        return getFileType(fileName) == FileTypeEnum.AUDIO;
    }

    public static boolean isDocument(String fileName) {
        return getFileType(fileName) == FileTypeEnum.DOCUMENT;
    }

    public static boolean isOther(String fileName) {
        return getFileType(fileName) == FileTypeEnum.OTHER;
    }

    public static Integer getFileTypeCode(String fileName) {
        return getFileType(fileName).getCode();
    }

}
